//! LogEvent 单元测试
//!
//! 测试日志事件结构体的功能

use log4r::{Level, LogEvent};

/// [P0] 测试 LogEvent::new 创建事件
#[test]
fn test_log_event_creation() {
    // GIVEN: 日志事件的各个字段
    let level = Level::Info;
    let message = "测试消息";
    let target = "test_module";

    // WHEN: 创建 LogEvent
    let event = LogEvent::new(level, target, message);

    // THEN: 字段应正确设置
    assert_eq!(event.level, Level::Info);
    assert_eq!(event.message, "测试消息");
    assert_eq!(event.target, "test_module");
    assert!(!event.write_to_syslog);
}

/// [P0] 测试 LogEvent Clone
#[test]
fn test_log_event_clone() {
    // GIVEN: 一个 LogEvent 实例
    let event = LogEvent::new(Level::Error, "error_module", "错误消息");

    // WHEN: 克隆事件
    let cloned = event.clone();

    // THEN: 克隆应与原始相等
    assert_eq!(cloned.level, event.level);
    assert_eq!(cloned.message, event.message);
    assert_eq!(cloned.target, event.target);
}

/// [P1] 测试 LogEvent Debug 格式化
#[test]
fn test_log_event_debug() {
    // GIVEN: 一个 LogEvent 实例
    let event = LogEvent::new(Level::Debug, "debug_module", "调试消息");

    // WHEN: 格式化为 Debug 字符串
    let debug_str = format!("{:?}", event);

    // THEN: 应包含所有字段信息
    assert!(debug_str.contains("LogEvent"));
    assert!(debug_str.contains("Debug"));
}

/// [P1] 测试 LogEvent 支持各种日志级别
#[test]
fn test_log_event_all_levels() {
    // GIVEN: 所有日志级别
    let levels = [
        Level::Trace,
        Level::Debug,
        Level::Info,
        Level::Warn,
        Level::Error,
        Level::Fatal,
    ];

    // WHEN/THEN: 每个级别都应能创建事件
    for level in levels {
        let event = LogEvent::new(level, "test", format!("{:?} 级别消息", level));
        assert_eq!(event.level, level);
    }
}

/// [P2] 测试 LogEvent 支持 Unicode 消息
#[test]
fn test_log_event_unicode_message() {
    // GIVEN: 包含 Unicode 字符的消息
    let message = "日志消息 🚀 émoji テスト";

    // WHEN: 创建 LogEvent
    let event = LogEvent::new(Level::Info, "unicode_test", message);

    // THEN: Unicode 消息应正确保存
    assert_eq!(event.message, message);
}

/// [P2] 测试 LogEvent 支持长消息
#[test]
fn test_log_event_long_message() {
    // GIVEN: 一条很长的消息
    let long_message = "x".repeat(10000);

    // WHEN: 创建 LogEvent
    let event = LogEvent::new(Level::Info, "long_test", long_message.clone());

    // THEN: 长消息应正确保存
    assert_eq!(event.message.len(), 10000);
}

/// [P0] 测试 FATAL 级别自动设置 write_to_syslog (AC-2.2.2)
#[test]
fn test_fatal_syslog_flag() {
    // GIVEN: FATAL 级别
    // WHEN: 创建 LogEvent
    let event = LogEvent::new(Level::Fatal, "test", "fatal error");

    // THEN: write_to_syslog 应为 true
    assert!(event.write_to_syslog);
    assert!(event.is_fatal());
    assert!(event.should_write_to_syslog());

    // 其他级别不设置
    let info_event = LogEvent::new(Level::Info, "test", "info message");
    assert!(!info_event.write_to_syslog);
    assert!(!info_event.is_fatal());
}

/// [P1] 测试 LogEvent Send+Sync 编译时验证 (AC-2.2.3)
#[test]
fn test_log_event_thread_safe() {
    // GIVEN: LogEvent 类型
    // WHEN: 检查 Send+Sync trait
    // THEN: 应满足线程安全要求
    fn assert_send_sync<T: Send + Sync>() {}
    assert_send_sync::<LogEvent>();
}

/// [P0] 测试 LogEvent::new 自动获取时间戳 (AC-2.2.4)
#[test]
fn test_log_event_timestamp_auto() {
    // GIVEN: 当前时间
    let before = time::OffsetDateTime::now_utc();

    // WHEN: 创建 LogEvent
    let event = LogEvent::new(Level::Info, "test", "message");

    // THEN: 时间戳应在合理范围内
    let after = time::OffsetDateTime::now_utc();
    let event_utc = event.timestamp.to_offset(time::UtcOffset::UTC);

    assert!(event_utc >= before);
    assert!(event_utc <= after);
}

/// [P0] 测试时区降级到 UTC
#[test]
fn test_timestamp_timezone_fallback() {
    // GIVEN: 可能无法获取本地时区的环境
    // WHEN: 创建 LogEvent
    let event = LogEvent::new(Level::Info, "test", "message");

    // THEN: 时间戳应有效（年份至少是 2020）
    assert!(event.timestamp.year() >= 2020);
}
